Objectif

Se familiariser avec la machine virtuelle SciViews Box, avec le logiciel RStudio et les documents de type R Notebook.

Prérequis

Procédure

La SciViews Box

Étape 1. Après avoir lancé la SciViews Box, la fenêtre d’accueil s’affiche. A partir de là, deux options permettent d’accéder au logiciel d’analyse de données et de représentation graphique R à travail l’interface de RStudio :

  • Rentrer dans la machine virtuelle pour y réaliser notre travail,
  • Ouvrir un page web dans le navigateur de l’ordinateur et y insérer l’adresse suivante : http://localhost:8718. En choisissant cette option, poursuivez à l’étape 5.

Conseil : essayez les deux approches. Selon les ordinateurs, et selon vos habitudes de travail, l’une des deux vous paraîtra rapidement plus facile et fluide que l’autre.


Étape 2. Entrez le mot de passe pour accéder à la machine virtuelle : sv1.


Étape 3. Après un petit moment, le bureau de la machine virtuelle apparaît. Il contient les éléments suivant :

  • Le “dock” en bas (encadré bleu) permet de lancer des applications et d’accéder aux fenêtres des applications en cours d’exécution. La SciViews Box est préinstallée avec une série d’applications intéressantes dans le cadre de la Science des Données, dont RStudio (encadré rouge).

  • La barre des applications en haut, avec à gauche, le menu d’accès à l’ensemble des applicatifs installés (encadré orange).


Étape 4. Si vous le souhaitez, prenez maintenant un peu de temps pour explorer le contenu de la SciViews Box. Que vous travailliez sous Windows, MacOS ou Linux, vous devriez trouver vos repère rapidement dans l’interface de cette machine virtuelle qui tourne sous Xubuntu, avec le bureau Xfce.


RStudio

Étape 5. Sélectionnez le raccourci RStudio dans le dock. Un login vers RStudio apparaît. Il faut y entrer les informations suivantes :

  • Username : sv
  • Password : sv
  • Cochez éventuellement Stay signed in pour éviter de devoir réentrer ces informations continuellement

Étape 6. RStudio s’ouvre. C’est votre interface de travail à partir de laquelle vous allez piloter R. La fenêtre principale comporte différents éléments :

  • Une barre de menu et une barre d’outils générale en haut (encadré bleu)
  • Un panneau à gauche intitulée Console (encadré orange) où vous pouvez entrer des instructions dans R pour manipuler vos données
  • Un panneau à droite en haut (encadré rouge) avec plusieurs onglets, dont Environnement qui vous indique les différents items (on parle d’objets) chargés en mémoire dans R (mais pour l’instant, il n’y a encore rien).
  • Un panneau en bas à droite (encadré gris) comportant lui aussi plusieurs onglets. Vous devriez voir le contenu de Files au démarrage, un explorateur de fichiers simplifié relatif au contexte de travail actuel dans RStudio.

Étape 7. Pour l’instant, aucun document de travail n’est encore ouvert. Pour en créer un, ou ouvrir un document existant, vous utilisez le menu Files, ou encore, le premier bouton de la barre d’outils générale (encadré en bleu ci-dessous) :

Le menu Session permet d’interagir directement avec R qui est lancé automatiquement en arrière plan dès que RStudio est ouvert. Par exemple, il est possible de relancer R à partir d’une entrée dans ce menu :

Le menu Help propose différentes possibilités pour accéder à la documentation de R ou de RStudio. Les aide-mémoires (“cheatsheets” en anglais) sont très pratiques lors de l’apprentissage. Nous conseillons de les imprimer et de les consulter régulièrement.

Le dernier bouton de la barre d’outils générale, intitulé Projects permet d’ouvrir, fermer, et gérer les projets RStudio.

Voir le tutoriel dédié aux projets dans RStudio.

Vous avez maintenant repéré les éléments fondamentaux de l’interface de RStudio.

A ce stade vous pouvez vous familiariser avec la cheatsheet relative à l’IDE RStudio. Vous verrez qu’il y a beaucoup de fonctionnalités accessibles à partir de la fenêtre principale de RStudio. Ne vous laissez pas intimider : vous les apprendrez progressivement au fur et à mesure de l’utilisation du logiciel. Contentez-vous pour l’instant de comprendre comment cette cheatsheet est structurée afin de pouvoir vous y référer facilement plus tard.


Document R Notebook

Étape 8. Cliquez sur le premier bouton de la barre d’outils pour créer un nouveau document. Vous voyez que RStudio permet de travailler avec différents types de documents différents. Nous allons créer à présent un R Notebook.


Étape 9. Le panneau contenant la Console de R est réduit en bas à gauche pour laisser à présent un maximum de place à un quatrième panneau qui apparaît en haut à gauche, et qui sert à éditer les documents comme ce R Notebook. Ce dernier ne porte pas de nom pour l’instant (il n’est pas encore sauvegardé dans un fichier), donc son onglet indique Untitled1).

Contrairement à un document Word par exemple, le R Notebook ne vous permet pas de visualiser directement le résultat final d’un rapport d’analyse2. Les balises de formatage de texte R Markdown sont expliquées dans les cheatsheets. Elles sont intuitives, après une courte phase d’apprentissage.

C’est le moment de vous référer aux cheatsheets relatives à R Markdown. Encore une fois, beaucoup d’information s’y trouve. Vous apprendrez tout cela progressivement. Regardez un peu plus attentivement celle intitulée “R Markdown Reference Guide” qui présente les balises Markdown principales à gauche et le résultat dans le document final formatté à droite dans sa première partie. Dans le menu d’aide de RStudio, vous avez aussi l’entrée “Markdown Quick Reference” qui rappelle ces balises dans l’onglet Help directement dans la fenêtre de RStudio. C’est bien utile au début !

Voyons maintenant ensemble l’anatomie d’un document R Markdown/R Notebook.

La première partie du document est appelé le préambule. Il est nécessairement situé au tout début du document et est balisé à l’aide de trois tirets --- au début et à la fin isolés sur leurs propres lignes. Le préambule comporte un ensemble de consignes pour la mise en forme générale du document. C’est donc là que nous indiquerons comment nous voulons réaliser notre rapport final. Nous pouvons aussi y indiquer un titre, le ou les auteurs, la date, … (A noter que l’entrée “author:” est incorrecte dans la copie d’écran: il faut un espace après le :)

Profitez-en pour y indiquer votre propre titre et votre nom comme auteur du document.

Le reste du document R Notebook est subdivisé en zones successives sur fond blanc et zones sur fond gris clair.

  • Les zones sur fond blanc sont des parties Markdown où vous pouvez écrire votre texte.
  • Les zones sur fond gris clair sont appelées des chunks. Elles contiennent des instructions qui vont être interprétées pour réaliser un calcul, un graphique, etc. Dans le document final, les chunks seront remplacés par le résultat du calcul. Ces chunks sont balisés en entrée par trois tirets inclinés à droite suivis d’accolades contenant des instructions relatives au programme à utiliser, par exemple, ```{r} pour des chunks faisant appel au logiciel R, et sont terminées par trois tirets inclinés à droite (```).

Dans les parties sur fond blanc, les zones Markdown, vous pouvez ajouter des balises qui permettront de formater votre texte dans la version finale de votre rapport. Par exemple, un ou plusieurs dièses (plus communément connu par sont appellation en anglais : “hastag”) en début de ligne suivi d’un espace indique que la suite correspond à un titre. Titre de niveau 1 avec un seul dièse, de niveau 2 avec deux dièses, et ainsi de suite jusqu’à 6 niveaux possibles. Dans la capture d’écran ci-dessous, nous avons remplacé tout le contenu du R Notebook (à part le préambule) par une série de titres de niveau 1 correspondant à la structure générale d’un rapport scientifique :

  • Introduction
  • Objectif
  • Matériels et méthodes
  • Résultats
  • Discussion
  • Conclusions (et perspectives)

Modifiez maintenant votre propre document R Notebook pour qu’il soit conforme à la capture d’écran. Pensez à aérer votre document avec des lignes vides entre les titres et entre les paragraphes. C’est indispensable pour une bonne compilation du rapport final, et c’est aussi pus lisible dans la version R Notebook en cours d’édition.


Étape 10. Insérez maintenant un chunk dans la partie Résultats. Pour se faire, placez le curseur juste après le titre # Résultats, appuyez sur la touche entrée pour ajouter une nouvelle ligne vide dans le document et utilisez le bouton vert Insert de la barre d’outils de l’éditeur R Notebook en choisissant un chunk R :

Une zone sur fond gris clair, balisée comme expliqué plus haut, et comportant quelques boutons à droite apparaît (encadré bleu ci-dessous). C’est dans cette zone spéciale que vous entrerez plus tard des instructions R pour vos analyses. L’important, pour l’instant dans ce tutoriel, est de bien comprendre la différence entre une zone Markdown et un chunk R. Nous n’entrerons donc rien pour l’instant dans ce chunk.


Étape 11. Sauvez le document dans le dossier adéquat. Cliquez sur le troisième bouton de la barre d’outils générale (icône de petite disquette bleue), ou sur le bouton équivalent dans la barre d’outils de l’éditeur R Notebook. Une boite de dialogue apparaît.

Commencez par naviguer vers le répertoire voulu, en l’occurrence ici, le sous-dossier reports de votre répertoire de base du projet Oursins (ATTENTION: ici à ce stade, on n’a pas encore créé le projet en question, ni le sous-dossier!!!)

Enfin, donnez un nom au fichier qui contiendra votre rapport (ce nom doit être informatif, mais peut être différent, et par exemple plus court, que le titre du document R Notebook). N’indiquez aucune extension (le .xxx à la fin du nom de fichier, comme .docx ou .xlsx). RStudio ajoutera automatiquement .Rmd pour “R Markdown”. Cliquez enfin sur Save.


Étape 12. Votre document étant maintenant sauvegardé sur le disque, vous pouvez employer le bouton Preview dans la barre d’outils de l’éditeur R Notebook pour compiler une version finale de votre rapport. A la fin du traitement, RStudio vous présentera le résultat final soit dans l’onglet Viewer, soit dans une fenêtre séparée (en fonction des options choisies dans les paramètres de RStudio). Il s’agit d’un document HTML ayant le même nom que votre R Notebook et dans le même dossier, mais avec une extension .nb.html. C’est le fichier contenant votre rapport final. Notez qu’il est également possible de générer un rapport à partir du même document, mais dans d’autres formats tels PDF ou Word, par exemple. Vous pourrez même créer des présentations ou des versions formatées selon les directives des éditeurs de journaux scientifiques, toujours à partir de la même source3… mais cela, c’est une autre histoire !

A la suite de ce tutoriel, vous devriez être désormais capable de lancer la machine virtuelle SciViews Box et le logiciel RStudio, et puis de créer et travailler dans un document R Markdown/R Notebook.


Pour en savoir plus

Copyright © 2017-2018, Guyliann Engels & Philippe Grosjean, Attribution-NonCommercial-ShareAlike 4.0 (CC BY-NC-SA 4.0).


  1. Ce mot de passe est court, et donc peu sécurisé. Ceci n’est pas important car, avec la configuration par défaut, vous n’avez accès à la SciViews Box que localement depuis l’ordinateur hôte. Cela réduit donc quasiment à néant les possibilités d’intrusions extérieures dans cette machine virtuelle (sauf si votre système hôte est lui-même attaqué, mais là, c’est ses protections propres que vous devez déployer comme d’habitude).

  2. Les systèmes d’édition professionnels dissocient en effet le fond de la forme : vous rédiger d’abord le contenu, et ensuite, vous indiquer le style à lui appliquer, comme pour le langage LaTex par exemple. C’est le même principe avec R Markdown dans RStudio.

  3. C’est là tout l’intérêt de dissocier le fond de la forme !

LS0tCnRpdGxlOiAiVHV0b3JpZWwgU0RELVVNT05TIDogcHJpc2UgZW4gbWFpbiBkZSBsYSBtYWNoaW5lIHZpcnR1ZWxsZSBTY2lWaWV3cyBCb3ggMjAxOCBldCBkZSBSU3R1ZGlvIgphdXRob3I6ICJFbmdlbHMgR3V5bGlhbm4gJiBHcm9zamVhbiBQaGlsaXBwZSIKZGF0ZTogIlZlcnNpb24gMS4xIC0gYXZyaWwgMjAxOCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IAogICAgaGlnaGxpZ2h0OiBrYXRlCiAgICB0aGVtZTogc3BhY2VsYWIKLS0tCgojIyBPYmplY3RpZgoKPiBTZSBmYW1pbGlhcmlzZXIgYXZlYyBsYSBtYWNoaW5lIHZpcnR1ZWxsZSBTY2lWaWV3cyBCb3gsIGF2ZWMgbGUgbG9naWNpZWwgUlN0dWRpbyBldCBsZXMgZG9jdW1lbnRzIGRlIHR5cGUgUiBOb3RlYm9vay4KCgojIyBQcsOpcmVxdWlzCgotIEluc3RhbGxhdGlvbiBkZSBsYSBtYWNoaW5lIHZpcnR1ZWxsZSA6IHZvaXIgdHV0b3JpZWwgZCdpbnN0YWxsYXRpb24gZGUgbGEgU2NpVmlld3MgQm94LgoKCiMjIFByb2PDqWR1cmUKCiMjIyBMYSBTY2lWaWV3cyBCb3gKCioqw4l0YXBlIDEuKiogQXByw6hzIGF2b2lyIGxhbmPDqSBsYSBTY2lWaWV3cyBCb3gsIGxhIGZlbsOqdHJlIGQnYWNjdWVpbCBzJ2FmZmljaGUuIEEgcGFydGlyIGRlIGzDoCwgZGV1eCBvcHRpb25zIHBlcm1ldHRlbnQgZCdhY2PDqWRlciBhdSBsb2dpY2llbCBkJ2FuYWx5c2UgZGUgZG9ubsOpZXMgZXQgZGUgcmVwcsOpc2VudGF0aW9uIGdyYXBoaXF1ZSAqKlIqKiDDoCB0cmF2YWlsIGwnaW50ZXJmYWNlIGRlICoqUlN0dWRpbyoqIDoKCi0gUmVudHJlciBkYW5zIGxhIG1hY2hpbmUgdmlydHVlbGxlIHBvdXIgeSByw6lhbGlzZXIgbm90cmUgdHJhdmFpbCwKLSBPdXZyaXIgdW4gcGFnZSB3ZWIgZGFucyBsZSBuYXZpZ2F0ZXVyIGRlIGwnb3JkaW5hdGV1ciBldCB5IGluc8OpcmVyIGwnYWRyZXNzZSBzdWl2YW50ZSA6IGBodHRwOi8vbG9jYWxob3N0Ojg3MThgLiBFbiBjaG9pc2lzc2FudCBjZXR0ZSBvcHRpb24sIHBvdXJzdWl2ZXogw6AgbCfDqXRhcGUgNS4KCioqQ29uc2VpbCA6IGVzc2F5ZXogbGVzIGRldXggYXBwcm9jaGVzLiBTZWxvbiBsZXMgb3JkaW5hdGV1cnMsIGV0IHNlbG9uIHZvcyBoYWJpdHVkZXMgZGUgdHJhdmFpbCwgbCd1bmUgZGVzIGRldXggdm91cyBwYXJhw650cmEgcmFwaWRlbWVudCBwbHVzIGZhY2lsZSBldCBmbHVpZGUgcXVlIGwnYXV0cmUuKioKCiFbXShmaWd1cmVzL3N0YXJ0MDEucG5nKQoKLS0tLQoKKirDiXRhcGUgMi4qKiBFbnRyZXogbGUgbW90IGRlIHBhc3NlIHBvdXIgYWNjw6lkZXIgw6AgbGEgbWFjaGluZSB2aXJ0dWVsbGUgOiAqKnN2KipeW0NlIG1vdCBkZSBwYXNzZSBlc3QgY291cnQsIGV0IGRvbmMgcGV1IHPDqWN1cmlzw6kuIENlY2kgbidlc3QgcGFzIGltcG9ydGFudCBjYXIsIGF2ZWMgbGEgY29uZmlndXJhdGlvbiBwYXIgZMOpZmF1dCwgdm91cyBuJ2F2ZXogYWNjw6hzIMOgIGxhIFNjaVZpZXdzIEJveCBxdWUgbG9jYWxlbWVudCBkZXB1aXMgbCdvcmRpbmF0ZXVyIGjDtHRlLiBDZWxhIHLDqWR1aXQgZG9uYyBxdWFzaW1lbnQgw6AgbsOpYW50IGxlcyBwb3NzaWJpbGl0w6lzIGQnaW50cnVzaW9ucyBleHTDqXJpZXVyZXMgZGFucyBjZXR0ZSBtYWNoaW5lIHZpcnR1ZWxsZSAoc2F1ZiBzaSB2b3RyZSBzeXN0w6htZSBow7R0ZSBlc3QgbHVpLW3Dqm1lIGF0dGFxdcOpLCBtYWlzIGzDoCwgYydlc3Qgc2VzIHByb3RlY3Rpb25zIHByb3ByZXMgcXVlIHZvdXMgZGV2ZXogZMOpcGxveWVyIGNvbW1lIGQnaGFiaXR1ZGUpLl0uCgohW10oZmlndXJlcy9zdGFydDAyLnBuZykKCi0tLS0KCioqw4l0YXBlIDMuKiogQXByw6hzIHVuIHBldGl0IG1vbWVudCwgbGUgYnVyZWF1IGRlIGxhIG1hY2hpbmUgdmlydHVlbGxlIGFwcGFyYcOudC4gSWwgY29udGllbnQgbGVzIMOpbMOpbWVudHMgc3VpdmFudCA6IAoKIVtdKGZpZ3VyZXMvc3RhcnQwMy5wbmcpCgotIExlICJkb2NrIiBlbiBiYXMgKGVuY2FkcsOpIGJsZXUpIHBlcm1ldCBkZSBsYW5jZXIgZGVzIGFwcGxpY2F0aW9ucyBldCBkJ2FjY8OpZGVyIGF1eCBmZW7DqnRyZXMgZGVzIGFwcGxpY2F0aW9ucyBlbiBjb3VycyBkJ2V4w6ljdXRpb24uIExhIFNjaVZpZXdzIEJveCBlc3QgcHLDqWluc3RhbGzDqWUgYXZlYyB1bmUgc8OpcmllIGQnYXBwbGljYXRpb25zIGludMOpcmVzc2FudGVzIGRhbnMgbGUgY2FkcmUgZGUgbGEgU2NpZW5jZSBkZXMgRG9ubsOpZXMsIGRvbnQgKipSU3R1ZGlvKiogKGVuY2FkcsOpIHJvdWdlKS4KCi0gTGEgYmFycmUgZGVzIGFwcGxpY2F0aW9ucyBlbiBoYXV0LCBhdmVjIMOgIGdhdWNoZSwgbGUgbWVudSBkJ2FjY8OocyDDoCBsJ2Vuc2VtYmxlIGRlcyBhcHBsaWNhdGlmcyBpbnN0YWxsw6lzIChlbmNhZHLDqSBvcmFuZ2UpLgoKLS0tLQoKKirDiXRhcGUgNC4qKiBTaSB2b3VzIGxlIHNvdWhhaXRleiwgcHJlbmV6IG1haW50ZW5hbnQgdW4gcGV1IGRlIHRlbXBzIHBvdXIgZXhwbG9yZXIgbGUgY29udGVudSBkZSBsYSBTY2lWaWV3cyBCb3guIFF1ZSB2b3VzIHRyYXZhaWxsaWV6IHNvdXMgV2luZG93cywgTWFjT1Mgb3UgTGludXgsIHZvdXMgZGV2cmlleiB0cm91dmVyIHZvcyByZXDDqHJlIHJhcGlkZW1lbnQgZGFucyBsJ2ludGVyZmFjZSBkZSBjZXR0ZSBtYWNoaW5lIHZpcnR1ZWxsZSBxdWkgdG91cm5lIHNvdXMgW1h1YnVudHVdKGh0dHBzOi8veHVidW50dS5vcmcvdG91ci8pLCBhdmVjIGxlIGJ1cmVhdSBbWGZjZV0oaHR0cHM6Ly94ZmNlLm9yZykuCgohW10oZmlndXJlcy9zdGFydDA0LnBuZykKCi0tLS0KCgojIyMgUlN0dWRpbwoKKirDiXRhcGUgNSoqLiBTw6lsZWN0aW9ubmV6IGxlIHJhY2NvdXJjaSAqKlJTdHVkaW8qKiBkYW5zIGxlIGRvY2suIFVuIGxvZ2luIHZlcnMgUlN0dWRpbyBhcHBhcmHDrnQuIElsIGZhdXQgeSBlbnRyZXIgbGVzIGluZm9ybWF0aW9ucyBzdWl2YW50ZXMgOgoKIVtdKGZpZ3VyZXMvc3RhcnQwNS5wbmcpCgotIFVzZXJuYW1lIDogKipzdioqCi0gUGFzc3dvcmQgOiAqKnN2KioKLSBDb2NoZXogw6l2ZW50dWVsbGVtZW50ICoqU3RheSBzaWduZWQgaW4qKiBwb3VyIMOpdml0ZXIgZGUgZGV2b2lyIHLDqWVudHJlciBjZXMgaW5mb3JtYXRpb25zIGNvbnRpbnVlbGxlbWVudAoKLS0tLQoKKirDiXRhcGUgNi4qKiAgUlN0dWRpbyBzJ291dnJlLiBDJ2VzdCB2b3RyZSBpbnRlcmZhY2UgZGUgdHJhdmFpbCDDoCBwYXJ0aXIgZGUgbGFxdWVsbGUgdm91cyBhbGxleiBwaWxvdGVyICoqUioqLiBMYSBmZW7DqnRyZSBwcmluY2lwYWxlIGNvbXBvcnRlIGRpZmbDqXJlbnRzIMOpbMOpbWVudHMgOgoKIVtdKGZpZ3VyZXMvc3RhcnQwNi5wbmcpCgotIFVuZSBiYXJyZSBkZSBtZW51IGV0IHVuZSBiYXJyZSBkJ291dGlscyBnw6luw6lyYWxlIGVuIGhhdXQgKGVuY2FkcsOpIGJsZXUpCi0gVW4gcGFubmVhdSDDoCBnYXVjaGUgaW50aXR1bMOpZSAqKkNvbnNvbGUqKiAoZW5jYWRyw6kgb3JhbmdlKSBvw7kgdm91cyBwb3V2ZXogZW50cmVyIGRlcyBpbnN0cnVjdGlvbnMgZGFucyAqKlIqKiBwb3VyIG1hbmlwdWxlciB2b3MgZG9ubsOpZXMKLSBVbiBwYW5uZWF1IMOgIGRyb2l0ZSBlbiBoYXV0IChlbmNhZHLDqSByb3VnZSkgYXZlYyBwbHVzaWV1cnMgb25nbGV0cywgZG9udCAqKkVudmlyb25uZW1lbnQqKiBxdWkgdm91cyBpbmRpcXVlIGxlcyBkaWZmw6lyZW50cyBpdGVtcyAob24gcGFybGUgZCcqKm9iamV0cyoqKSBjaGFyZ8OpcyBlbiBtw6ltb2lyZSBkYW5zICoqUioqIChtYWlzIHBvdXIgbOKAmWluc3RhbnQsIGlsIG4neSBhIGVuY29yZSByaWVuKS4KLSBVbiBwYW5uZWF1IGVuIGJhcyDDoCBkcm9pdGUgKGVuY2FkcsOpIGdyaXMpIGNvbXBvcnRhbnQgbHVpIGF1c3NpIHBsdXNpZXVycyBvbmdsZXRzLiBWb3VzIGRldnJpZXogdm9pciBsZSBjb250ZW51IGRlICoqRmlsZXMqKiBhdSBkw6ltYXJyYWdlLCB1biBleHBsb3JhdGV1ciBkZSBmaWNoaWVycyBzaW1wbGlmacOpIHJlbGF0aWYgYXUgY29udGV4dGUgZGUgdHJhdmFpbCBhY3R1ZWwgZGFucyBSU3R1ZGlvLgoKLS0tLQoKKirDiXRhcGUgNy4qKiBQb3VyIGwnaW5zdGFudCwgYXVjdW4gZG9jdW1lbnQgZGUgdHJhdmFpbCBuJ2VzdCBlbmNvcmUgb3V2ZXJ0LiBQb3VyIGVuIGNyw6llciB1biwgb3Ugb3V2cmlyIHVuIGRvY3VtZW50IGV4aXN0YW50LCB2b3VzIHV0aWxpc2V6IGxlIG1lbnUgKipGaWxlcyoqLCBvdSBlbmNvcmUsIGxlIHByZW1pZXIgYm91dG9uIGRlIGxhIGJhcnJlIGQnb3V0aWxzIGfDqW7DqXJhbGUgKGVuY2FkcsOpIGVuIGJsZXUgY2ktZGVzc291cykgOgoKIVtdKGZpZ3VyZXMvc3RhcnQwNy0xLnBuZykKCkxlIG1lbnUgKipTZXNzaW9uKiogcGVybWV0IGQnaW50ZXJhZ2lyIGRpcmVjdGVtZW50IGF2ZWMgKipSKiogcXVpIGVzdCBsYW5jw6kgYXV0b21hdGlxdWVtZW50IGVuIGFycmnDqHJlIHBsYW4gZMOocyBxdWUgUlN0dWRpbyBlc3Qgb3V2ZXJ0LiBQYXIgZXhlbXBsZSwgaWwgZXN0IHBvc3NpYmxlIGRlIHJlbGFuY2VyICoqUioqIMOgIHBhcnRpciBkJ3VuZSBlbnRyw6llIGRhbnMgY2UgbWVudSA6CgohW10oZmlndXJlcy9zdGFydDA3LTIucG5nKQoKTGUgbWVudSAqKkhlbHAqKiBwcm9wb3NlIGRpZmbDqXJlbnRlcyBwb3NzaWJpbGl0w6lzIHBvdXIgYWNjw6lkZXIgw6AgbGEgZG9jdW1lbnRhdGlvbiBkZSAqKlIqKiBvdSBkZSAqKlJTdHVkaW8qKi4gTGVzICoqYWlkZS1tw6ltb2lyZXMqKiAoImNoZWF0c2hlZXRzIiBlbiBhbmdsYWlzKSBzb250IHRyw6hzIHByYXRpcXVlcyBsb3JzIGRlIGwnYXBwcmVudGlzc2FnZS4gTm91cyBjb25zZWlsbG9ucyBkZSBsZXMgaW1wcmltZXIgZXQgZGUgbGVzIGNvbnN1bHRlciByw6lndWxpw6hyZW1lbnQuCgohW10oZmlndXJlcy9zdGFydDA3LTMucG5nKQoKTGUgZGVybmllciBib3V0b24gZGUgbGEgYmFycmUgZCdvdXRpbHMgZ8OpbsOpcmFsZSwgaW50aXR1bMOpICoqUHJvamVjdHMqKiBwZXJtZXQgZCdvdXZyaXIsIGZlcm1lciwgZXQgZ8OpcmVyIGxlcyBwcm9qZXRzIFJTdHVkaW8uCgohW10oZmlndXJlcy9zdGFydDA3LTQucG5nKQoKPiBWb2lyIGxlIHR1dG9yaWVsIGTDqWRpw6kgYXV4IHByb2pldHMgZGFucyBSU3R1ZGlvLgoKVm91cyBhdmV6IG1haW50ZW5hbnQgcmVww6lyw6kgbGVzIMOpbMOpbWVudHMgZm9uZGFtZW50YXV4IGRlIGwnaW50ZXJmYWNlIGRlIFJTdHVkaW8uCgpfQSBjZSBzdGFkZSB2b3VzIHBvdXZleiB2b3VzIGZhbWlsaWFyaXNlciBhdmVjIGxhIGNoZWF0c2hlZXQgcmVsYXRpdmUgw6AgbCdJREUgUlN0dWRpby4gVm91cyB2ZXJyZXogcXUnaWwgeSBhIGJlYXVjb3VwIGRlIGZvbmN0aW9ubmFsaXTDqXMgYWNjZXNzaWJsZXMgw6AgcGFydGlyIGRlIGxhIGZlbsOqdHJlIHByaW5jaXBhbGUgZGUgUlN0dWRpby4gTmUgdm91cyBsYWlzc2V6IHBhcyBpbnRpbWlkZXIgOiB2b3VzIGxlcyBhcHByZW5kcmV6IHByb2dyZXNzaXZlbWVudCBhdSBmdXIgZXQgw6AgbWVzdXJlIGRlIGwndXRpbGlzYXRpb24gZHUgbG9naWNpZWwuIENvbnRlbnRlei12b3VzIHBvdXIgbCdpbnN0YW50IGRlIGNvbXByZW5kcmUgY29tbWVudCBjZXR0ZSBjaGVhdHNoZWV0IGVzdCBzdHJ1Y3R1csOpZSBhZmluIGRlIHBvdXZvaXIgdm91cyB5IHLDqWbDqXJlciBmYWNpbGVtZW50IHBsdXMgdGFyZC5fCgotLS0tCgoKIyMjIERvY3VtZW50IFIgTm90ZWJvb2sKCioqw4l0YXBlIDguKiogQ2xpcXVleiBzdXIgbGUgcHJlbWllciBib3V0b24gZGUgbGEgYmFycmUgZCdvdXRpbHMgcG91ciBjcsOpZXIgdW4gbm91dmVhdSBkb2N1bWVudC4gVm91cyB2b3lleiBxdWUgUlN0dWRpbyBwZXJtZXQgZGUgdHJhdmFpbGxlciBhdmVjIGRpZmbDqXJlbnRzIHR5cGVzIGRlIGRvY3VtZW50cyBkaWZmw6lyZW50cy4gTm91cyBhbGxvbnMgY3LDqWVyIMOgIHByw6lzZW50IHVuICoqUiBOb3RlYm9vayoqLgoKIVtdKGZpZ3VyZXMvc3RhcnQwOC5wbmcpCgotLS0tCgoqKsOJdGFwZSA5LioqIExlIHBhbm5lYXUgY29udGVuYW50IGxhICoqQ29uc29sZSoqIGRlICoqUioqIGVzdCByw6lkdWl0IGVuIGJhcyDDoCBnYXVjaGUgcG91ciBsYWlzc2VyIMOgIHByw6lzZW50IHVuIG1heGltdW0gZGUgcGxhY2Ugw6AgdW4gcXVhdHJpw6htZSBwYW5uZWF1IHF1aSBhcHBhcmHDrnQgZW4gaGF1dCDDoCBnYXVjaGUsIGV0IHF1aSBzZXJ0IMOgIMOpZGl0ZXIgbGVzIGRvY3VtZW50cyBjb21tZSBjZSBSIE5vdGVib29rLiBDZSBkZXJuaWVyIG5lIHBvcnRlIHBhcyBkZSBub20gcG91ciBsJ2luc3RhbnQgKGlsIG4nZXN0IHBhcyBlbmNvcmUgc2F1dmVnYXJkw6kgZGFucyB1biBmaWNoaWVyKSwgZG9uYyBzb24gb25nbGV0IGluZGlxdWUgKipVbnRpdGxlZDEqKikuCgohW10oZmlndXJlcy9zdGFydDA5LnBuZykKCkNvbnRyYWlyZW1lbnQgw6AgdW4gZG9jdW1lbnQgV29yZCBwYXIgZXhlbXBsZSwgbGUgUiBOb3RlYm9vayBuZSB2b3VzIHBlcm1ldCBwYXMgZGUgdmlzdWFsaXNlciBkaXJlY3RlbWVudCBsZSByw6lzdWx0YXQgZmluYWwgZCd1biByYXBwb3J0IGQnYW5hbHlzZV5bTGVzIHN5c3TDqG1lcyBkJ8OpZGl0aW9uIHByb2Zlc3Npb25uZWxzIGRpc3NvY2llbnQgZW4gZWZmZXQgbGUgZm9uZCBkZSBsYSBmb3JtZSA6IHZvdXMgcsOpZGlnZXIgZCdhYm9yZCBsZSBjb250ZW51LCBldCBlbnN1aXRlLCB2b3VzIGluZGlxdWVyIGxlIHN0eWxlIMOgIGx1aSBhcHBsaXF1ZXIsIGNvbW1lIHBvdXIgbGUgbGFuZ2FnZSBbTGFUZXhdKGh0dHBzOi8vb3BlbmNsYXNzcm9vbXMuY29tL2NvdXJzZXMvcmVkaWdlei1kZXMtZG9jdW1lbnRzLWRlLXF1YWxpdGUtYXZlYy1sYXRleC9xdS1lc3QtY2UtcXVlLWxhdGV4KSBwYXIgZXhlbXBsZS4gQydlc3QgbGUgbcOqbWUgcHJpbmNpcGUgYXZlYyBSIE1hcmtkb3duIGRhbnMgUlN0dWRpby5dLiBMZXMgYmFsaXNlcyBkZSBmb3JtYXRhZ2UgZGUgdGV4dGUgUiBNYXJrZG93biBzb250IGV4cGxpcXXDqWVzIGRhbnMgbGVzICoqY2hlYXRzaGVldHMqKi4gRWxsZXMgc29udCBpbnR1aXRpdmVzLCBhcHLDqHMgdW5lIGNvdXJ0ZSBwaGFzZSBkJ2FwcHJlbnRpc3NhZ2UuCgpfQydlc3QgbGUgbW9tZW50IGRlIHZvdXMgcsOpZsOpcmVyIGF1eCBjaGVhdHNoZWV0cyByZWxhdGl2ZXMgw6AgUiBNYXJrZG93bi4gRW5jb3JlIHVuZSBmb2lzLCBiZWF1Y291cCBkJ2luZm9ybWF0aW9uIHMneSB0cm91dmUuIFZvdXMgYXBwcmVuZHJleiB0b3V0IGNlbGEgcHJvZ3Jlc3NpdmVtZW50LiBSZWdhcmRleiB1biBwZXUgcGx1cyBhdHRlbnRpdmVtZW50IGNlbGxlIGludGl0dWzDqWUgIlIgTWFya2Rvd24gUmVmZXJlbmNlIEd1aWRlIiBxdWkgcHLDqXNlbnRlIGxlcyBiYWxpc2VzIE1hcmtkb3duIHByaW5jaXBhbGVzIMOgIGdhdWNoZSBldCBsZSByw6lzdWx0YXQgZGFucyBsZSBkb2N1bWVudCBmaW5hbCBmb3JtYXR0w6kgw6AgZHJvaXRlIGRhbnMgc2EgcHJlbWnDqHJlIHBhcnRpZS4gRGFucyBsZSBtZW51IGQnYWlkZSBkZSBSU3R1ZGlvLCB2b3VzIGF2ZXogYXVzc2kgbCdlbnRyw6llICJNYXJrZG93biBRdWljayBSZWZlcmVuY2UiIHF1aSByYXBwZWxsZSBjZXMgYmFsaXNlcyBkYW5zIGwnb25nbGV0ICoqSGVscCoqIGRpcmVjdGVtZW50IGRhbnMgbGEgZmVuw6p0cmUgZGUgUlN0dWRpby4gQydlc3QgYmllbiB1dGlsZSBhdSBkw6lidXQgIV8KClZveW9ucyBtYWludGVuYW50IGVuc2VtYmxlIGwnYW5hdG9taWUgZCd1biBkb2N1bWVudCBSIE1hcmtkb3duL1IgTm90ZWJvb2suCgpMYSBwcmVtacOocmUgcGFydGllIGR1IGRvY3VtZW50IGVzdCBhcHBlbMOpIGxlICoqcHLDqWFtYnVsZSoqLiBJbCBlc3QgbsOpY2Vzc2FpcmVtZW50IHNpdHXDqSBhdSB0b3V0IGTDqWJ1dCBkdSBkb2N1bWVudCBldCBlc3QgYmFsaXPDqSDDoCBsJ2FpZGUgZGUgdHJvaXMgdGlyZXRzIGAtLS1gIGF1IGTDqWJ1dCBldCDDoCBsYSBmaW4gaXNvbMOpcyBzdXIgbGV1cnMgcHJvcHJlcyBsaWduZXMuIExlIHByw6lhbWJ1bGUgY29tcG9ydGUgdW4gZW5zZW1ibGUgZGUgY29uc2lnbmVzIHBvdXIgbGEgbWlzZSBlbiBmb3JtZSBnw6luw6lyYWxlIGR1IGRvY3VtZW50LiBDJ2VzdCBkb25jIGzDoCBxdWUgbm91cyBpbmRpcXVlcm9ucyBjb21tZW50IG5vdXMgdm91bG9ucyByw6lhbGlzZXIgbm90cmUgcmFwcG9ydCBmaW5hbC4gTm91cyBwb3V2b25zIGF1c3NpIHkgaW5kaXF1ZXIgdW4gdGl0cmUsIGxlIG91IGxlcyBhdXRldXJzLCBsYSBkYXRlLCAuLi4gKCoqQSBub3RlciBxdWUgbCdlbnRyw6llICJhdXRob3I6IiBlc3QgaW5jb3JyZWN0ZSBkYW5zIGxhIGNvcGllIGQnw6ljcmFuOiBpbCBmYXV0IHVuIGVzcGFjZSBhcHLDqHMgbGUgOioqKQoKIVtdKGZpZ3VyZXMvc3RhcnQxMC5wbmcpCgpfUHJvZml0ZXotZW4gcG91ciB5IGluZGlxdWVyIHZvdHJlIHByb3ByZSB0aXRyZSBldCB2b3RyZSBub20gY29tbWUgYXV0ZXVyIGR1IGRvY3VtZW50Ll8KCkxlIHJlc3RlIGR1IGRvY3VtZW50IFIgTm90ZWJvb2sgZXN0IHN1YmRpdmlzw6kgZW4gem9uZXMgc3VjY2Vzc2l2ZXMgc3VyIGZvbmQgYmxhbmMgZXQgem9uZXMgc3VyIGZvbmQgZ3JpcyBjbGFpci4KCi0gTGVzIHpvbmVzIHN1ciBmb25kIGJsYW5jIHNvbnQgZGVzIHBhcnRpZXMgTWFya2Rvd24gb8O5IHZvdXMgcG91dmV6IMOpY3JpcmUgdm90cmUgdGV4dGUuCi0gTGVzIHpvbmVzIHN1ciBmb25kIGdyaXMgY2xhaXIgc29udCBhcHBlbMOpZXMgZGVzICoqY2h1bmtzKiouIEVsbGVzIGNvbnRpZW5uZW50IGRlcyBpbnN0cnVjdGlvbnMgcXVpIHZvbnQgw6p0cmUgaW50ZXJwcsOpdMOpZXMgcG91ciByw6lhbGlzZXIgdW4gY2FsY3VsLCB1biBncmFwaGlxdWUsIGV0Yy4gRGFucyBsZSBkb2N1bWVudCBmaW5hbCwgbGVzIGNodW5rcyBzZXJvbnQgcmVtcGxhY8OpcyBwYXIgbGUgcsOpc3VsdGF0IGR1IGNhbGN1bC4gQ2VzIGNodW5rcyBzb250IGJhbGlzw6lzIGVuIGVudHLDqWUgcGFyIHRyb2lzIHRpcmV0cyBpbmNsaW7DqXMgw6AgZHJvaXRlIHN1aXZpcyBkJ2FjY29sYWRlcyBjb250ZW5hbnQgZGVzIGluc3RydWN0aW9ucyByZWxhdGl2ZXMgYXUgcHJvZ3JhbW1lIMOgIHV0aWxpc2VyLCBwYXIgZXhlbXBsZSwgYGBgYCBgYGB7cn0gYGBgYCBwb3VyIGRlcyBjaHVua3MgZmFpc2FudCBhcHBlbCBhdSBsb2dpY2llbCAqKlIqKiwgZXQgc29udCB0ZXJtaW7DqWVzIHBhciB0cm9pcyB0aXJldHMgaW5jbGluw6lzIMOgIGRyb2l0ZSAoYGBgYCBgYGAgYGBgYCkuCgpEYW5zIGxlcyBwYXJ0aWVzIHN1ciBmb25kIGJsYW5jLCBsZXMgem9uZXMgTWFya2Rvd24sIHZvdXMgcG91dmV6IGFqb3V0ZXIgZGVzIGJhbGlzZXMgcXVpIHBlcm1ldHRyb250IGRlIGZvcm1hdGVyIHZvdHJlIHRleHRlIGRhbnMgbGEgdmVyc2lvbiBmaW5hbGUgZGUgdm90cmUgcmFwcG9ydC4gUGFyIGV4ZW1wbGUsIHVuIG91IHBsdXNpZXVycyBkacOoc2VzIChwbHVzIGNvbW11bsOpbWVudCBjb25udSBwYXIgc29udCBhcHBlbGxhdGlvbiBlbiBhbmdsYWlzIDogImhhc3RhZyIpIGVuIGTDqWJ1dCBkZSBsaWduZSBzdWl2aSBkJ3VuIGVzcGFjZSBpbmRpcXVlIHF1ZSBsYSBzdWl0ZSBjb3JyZXNwb25kIMOgIHVuIHRpdHJlLiBUaXRyZSBkZSBuaXZlYXUgMSBhdmVjIHVuIHNldWwgZGnDqHNlLCBkZSBuaXZlYXUgMiBhdmVjIGRldXggZGnDqHNlcywgZXQgYWluc2kgZGUgc3VpdGUganVzcXUnw6AgNiBuaXZlYXV4IHBvc3NpYmxlcy4gRGFucyBsYSBjYXB0dXJlIGQnw6ljcmFuIGNpLWRlc3NvdXMsIG5vdXMgYXZvbnMgcmVtcGxhY8OpIHRvdXQgbGUgY29udGVudSBkdSBSIE5vdGVib29rICjDoCBwYXJ0IGxlIHByw6lhbWJ1bGUpIHBhciB1bmUgc8OpcmllIGRlIHRpdHJlcyBkZSBuaXZlYXUgMSBjb3JyZXNwb25kYW50IMOgIGxhIHN0cnVjdHVyZSBnw6luw6lyYWxlIGQndW4gcmFwcG9ydCBzY2llbnRpZmlxdWUgOiAKCi0gSW50cm9kdWN0aW9uCi0gT2JqZWN0aWYKLSBNYXTDqXJpZWxzIGV0IG3DqXRob2RlcwotIFLDqXN1bHRhdHMKLSBEaXNjdXNzaW9uCi0gQ29uY2x1c2lvbnMgKGV0IHBlcnNwZWN0aXZlcykKCiFbXShmaWd1cmVzL3N0YXJ0MTEucG5nKQoKTW9kaWZpZXogbWFpbnRlbmFudCB2b3RyZSBwcm9wcmUgZG9jdW1lbnQgUiBOb3RlYm9vayBwb3VyIHF1J2lsIHNvaXQgY29uZm9ybWUgw6AgbGEgY2FwdHVyZSBkJ8OpY3Jhbi4gUGVuc2V6IMOgIGHDqXJlciB2b3RyZSBkb2N1bWVudCBhdmVjIGRlcyBsaWduZXMgdmlkZXMgZW50cmUgbGVzIHRpdHJlcyBldCBlbnRyZSBsZXMgcGFyYWdyYXBoZXMuIEMnZXN0IGluZGlzcGVuc2FibGUgcG91ciB1bmUgYm9ubmUgY29tcGlsYXRpb24gZHUgcmFwcG9ydCBmaW5hbCwgZXQgYydlc3QgYXVzc2kgcHVzIGxpc2libGUgZGFucyBsYSB2ZXJzaW9uIFIgTm90ZWJvb2sgZW4gY291cnMgZCfDqWRpdGlvbi4KCi0tLS0KCioqw4l0YXBlIDEwLioqIEluc8OpcmV6IG1haW50ZW5hbnQgdW4gY2h1bmsgZGFucyBsYSBwYXJ0aWUgKipSw6lzdWx0YXRzKiouIFBvdXIgc2UgZmFpcmUsIHBsYWNleiBsZSBjdXJzZXVyIGp1c3RlIGFwcsOocyBsZSB0aXRyZSBgIyBSw6lzdWx0YXRzYCwgYXBwdXlleiBzdXIgbGEgdG91Y2hlIGVudHLDqWUgcG91ciBham91dGVyIHVuZSBub3V2ZWxsZSBsaWduZSB2aWRlIGRhbnMgbGUgZG9jdW1lbnQgZXQgdXRpbGlzZXogbGUgYm91dG9uIHZlcnQgKipJbnNlcnQqKiBkZSBsYSBiYXJyZSBkJ291dGlscyBkZSBsJ8OpZGl0ZXVyIFIgTm90ZWJvb2sgZW4gY2hvaXNpc3NhbnQgdW4gY2h1bmsgKipSKiogOgoKIVtdKGZpZ3VyZXMvc3RhcnQxMi5wbmcpCgpVbmUgem9uZSBzdXIgZm9uZCBncmlzIGNsYWlyLCBiYWxpc8OpZSBjb21tZSBleHBsaXF1w6kgcGx1cyBoYXV0LCBldCBjb21wb3J0YW50IHF1ZWxxdWVzIGJvdXRvbnMgw6AgZHJvaXRlIGFwcGFyYcOudCAoZW5jYWRyw6kgYmxldSBjaS1kZXNzb3VzKS4gQydlc3QgZGFucyBjZXR0ZSB6b25lIHNww6ljaWFsZSBxdWUgdm91cyBlbnRyZXJleiBwbHVzIHRhcmQgZGVzIGluc3RydWN0aW9ucyAqKlIqKiBwb3VyIHZvcyBhbmFseXNlcy4gTCdpbXBvcnRhbnQsIHBvdXIgbCdpbnN0YW50IGRhbnMgY2UgdHV0b3JpZWwsIGVzdCBkZSBiaWVuIGNvbXByZW5kcmUgbGEgZGlmZsOpcmVuY2UgZW50cmUgdW5lIHpvbmUgTWFya2Rvd24gZXQgdW4gY2h1bmsgUi4gTm91cyBuJ2VudHJlcm9ucyBkb25jIHJpZW4gcG91ciBsJ2luc3RhbnQgZGFucyBjZSBjaHVuay4KCiFbXShmaWd1cmVzL3N0YXJ0MTMucG5nKQoKLS0tLQoKKirDiXRhcGUgMTEuKiogU2F1dmV6IGxlIGRvY3VtZW50IGRhbnMgbGUgZG9zc2llciBhZMOpcXVhdC4gQ2xpcXVleiBzdXIgbGUgdHJvaXNpw6htZSBib3V0b24gZGUgbGEgYmFycmUgZCdvdXRpbHMgZ8OpbsOpcmFsZSAoaWPDtG5lIGRlIHBldGl0ZSBkaXNxdWV0dGUgYmxldWUpLCBvdSBzdXIgbGUgYm91dG9uIMOpcXVpdmFsZW50IGRhbnMgbGEgYmFycmUgZCdvdXRpbHMgZGUgbCfDqWRpdGV1ciBSIE5vdGVib29rLiBVbmUgYm9pdGUgZGUgZGlhbG9ndWUgYXBwYXJhw650LgoKIVtdKGZpZ3VyZXMvc3RhcnQxNC5wbmcpCgpDb21tZW5jZXogcGFyIG5hdmlndWVyIHZlcnMgbGUgcsOpcGVydG9pcmUgdm91bHUsIGVuIGzigJlvY2N1cnJlbmNlIGljaSwgbGUgc291cy1kb3NzaWVyIGByZXBvcnRzYCBkZSB2b3RyZSByw6lwZXJ0b2lyZSBkZSBiYXNlIGR1IHByb2pldCBgT3Vyc2luc2AgKCoqQVRURU5USU9OOiBpY2kgw6AgY2Ugc3RhZGUsIG9uIG4nYSBwYXMgZW5jb3JlIGNyw6nDqSBsZSBwcm9qZXQgZW4gcXVlc3Rpb24sIG5pIGxlIHNvdXMtZG9zc2llciEhISoqKQoKIVtdKGZpZ3VyZXMvc3RhcnQxNS5wbmcpCgpFbmZpbiwgZG9ubmV6IHVuIG5vbSBhdSBmaWNoaWVyIHF1aSBjb250aWVuZHJhIHZvdHJlIHJhcHBvcnQgKGNlIG5vbSBkb2l0IMOqdHJlIGluZm9ybWF0aWYsIG1haXMgcGV1dCDDqnRyZSBkaWZmw6lyZW50LCBldCBwYXIgZXhlbXBsZSBwbHVzIGNvdXJ0LCBxdWUgbGUgdGl0cmUgZHUgZG9jdW1lbnQgUiBOb3RlYm9vaykuICoqTidpbmRpcXVleiBhdWN1bmUgZXh0ZW5zaW9uIChsZSBgLnh4eGAgw6AgbGEgZmluIGR1IG5vbSBkZSBmaWNoaWVyLCBjb21tZSBgLmRvY3hgIG91IGAueGxzeGApLiBSU3R1ZGlvIGFqb3V0ZXJhIGF1dG9tYXRpcXVlbWVudCBgLlJtZGAgcG91ciAiUiBNYXJrZG93biIuKiogQ2xpcXVleiBlbmZpbiBzdXIgKipTYXZlKiouCgohW10oZmlndXJlcy9zdGFydDE2LnBuZykKCi0tLS0KCioqw4l0YXBlIDEyLioqIFZvdHJlIGRvY3VtZW50IMOpdGFudCBtYWludGVuYW50IHNhdXZlZ2FyZMOpIHN1ciBsZSBkaXNxdWUsIHZvdXMgcG91dmV6IGVtcGxveWVyIGxlIGJvdXRvbiAqKlByZXZpZXcqKiBkYW5zIGxhIGJhcnJlIGQnb3V0aWxzIGRlIGwnw6lkaXRldXIgUiBOb3RlYm9vayBwb3VyIGNvbXBpbGVyIHVuZSB2ZXJzaW9uIGZpbmFsZSBkZSB2b3RyZSByYXBwb3J0LiBBIGxhIGZpbiBkdSB0cmFpdGVtZW50LCBSU3R1ZGlvIHZvdXMgcHLDqXNlbnRlcmEgbGUgcsOpc3VsdGF0IGZpbmFsIHNvaXQgZGFucyBsJ29uZ2xldCAqKlZpZXdlcioqLCBzb2l0IGRhbnMgdW5lIGZlbsOqdHJlIHPDqXBhcsOpZSAoZW4gZm9uY3Rpb24gZGVzIG9wdGlvbnMgY2hvaXNpZXMgZGFucyBsZXMgcGFyYW3DqHRyZXMgZGUgUlN0dWRpbykuIElsIHMnYWdpdCBkJ3VuIGRvY3VtZW50IEhUTUwgYXlhbnQgbGUgbcOqbWUgbm9tIHF1ZSB2b3RyZSBSIE5vdGVib29rIGV0IGRhbnMgbGUgbcOqbWUgZG9zc2llciwgbWFpcyBhdmVjIHVuZSBleHRlbnNpb24gYC5uYi5odG1sYC4gQydlc3QgbGUgZmljaGllciBjb250ZW5hbnQgdm90cmUgcmFwcG9ydCBmaW5hbC4gTm90ZXogcXUnaWwgZXN0IMOpZ2FsZW1lbnQgcG9zc2libGUgZGUgZ8OpbsOpcmVyIHVuIHJhcHBvcnQgw6AgcGFydGlyIGR1IG3Dqm1lIGRvY3VtZW50LCBtYWlzIGRhbnMgZCdhdXRyZXMgZm9ybWF0cyB0ZWxzIFBERiBvdSBXb3JkLCBwYXIgZXhlbXBsZS4gVm91cyBwb3VycmV6IG3Dqm1lIGNyw6llciBkZXMgcHLDqXNlbnRhdGlvbnMgb3UgZGVzIHZlcnNpb25zIGZvcm1hdMOpZXMgc2Vsb24gbGVzIGRpcmVjdGl2ZXMgZGVzIMOpZGl0ZXVycyBkZSBqb3VybmF1eCBzY2llbnRpZmlxdWVzLCB0b3Vqb3VycyDDoCBwYXJ0aXIgZGUgbGEgbcOqbWUgc291cmNlXltDJ2VzdCBsw6AgdG91dCBsJ2ludMOpcsOqdCBkZSBkaXNzb2NpZXIgbGUgZm9uZCBkZSBsYSBmb3JtZSAhXS4uLiBtYWlzIGNlbGEsIGMnZXN0IHVuZSBhdXRyZSBoaXN0b2lyZSAhCgohW10oZmlndXJlcy9zdGFydDE3LnBuZykKCl9BIGxhIHN1aXRlIGRlIGNlIHR1dG9yaWVsLCB2b3VzIGRldnJpZXogw6p0cmUgZMOpc29ybWFpcyBjYXBhYmxlIGRlIGxhbmNlciBsYSBtYWNoaW5lIHZpcnR1ZWxsZSBTY2lWaWV3cyBCb3ggZXQgbGUgbG9naWNpZWwgUlN0dWRpbywgZXQgcHVpcyBkZSBjcsOpZXIgZXQgdHJhdmFpbGxlciBkYW5zIHVuIGRvY3VtZW50IFIgTWFya2Rvd24vUiBOb3RlYm9vay5fCgotLS0tCgoKIyMgUG91ciBlbiBzYXZvaXIgcGx1cwoKLSBbUlN0dWRpbyBJREUgQ2hlYXQgU2hlZXRdKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE2LzAxL3JzdHVkaW8tSURFLWNoZWF0c2hlZXQucGRmKSBkaXNwb25pYmxlIGVuIHZlcnNpb24gUERGIGRhbnMgbGUgZG9zc2llciBgfi9TaGFyZWQvRG9jYC4gCi0gW1IgTWFya2Rvd24gQ2hlYXQgU2hlZXRdKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE1LzAyL3JtYXJrZG93bi1jaGVhdHNoZWV0LnBkZikgZGlzcG9uaWJsZSBlbiB2ZXJzaW9uIFBERiBkYW5zIGxlIGRvc3NpZXIgYH4vU2hhcmVkL0RvY2AuCi0gW1IgTWFya2Rvd24gUmVmZXJlbmNlXShodHRwczovL3d3dy5yc3R1ZGlvLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAxNS8wMy9ybWFya2Rvd24tcmVmZXJlbmNlLnBkZikgZGlzcG9uaWJsZSBlbiB2ZXJzaW9uIFBERiBkYW5zIGxlIGRvc3NpZXIgYH4vU2hhcmVkL0RvY2AuCi0gW0xlcyBiYXNlIGRlIFJdKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE2LzEwL3ItY2hlYXQtc2hlZXQtMy5wZGYpIGRpc3BvbmlibGUgZW4gdmVyc2lvbiBQREYgZGFucyBsZSBkb3NzaWVyIGB+L1NoYXJlZC9Eb2NgLgoKCl9Db3B5cmlnaHQgwqkgMjAxNy0yMDE4LCBHdXlsaWFubiBFbmdlbHMgJiBQaGlsaXBwZSBHcm9zamVhbiwgW0F0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwtU2hhcmVBbGlrZSA0LjAgKENDIEJZLU5DLVNBIDQuMCldKGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy1zYS80LjAvZGVlZC5mcikuXwo=